package controlador;

import vista.InterfazGraficaReporteVenta;
import vista.Mensaje;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.util.List;
import java.util.ArrayList;
import modelo.VentaDao;
import modelo.Venta;


public class ControladorReporteVenta implements ActionListener,WindowListener,ItemListener
{
	private InterfazGraficaReporteVenta interfazGrafica;
	private ControladorPrincipal controladorPrincipal;
	private List<Venta> ventas; 
	
	public ControladorReporteVenta(ControladorPrincipal controladorPrincipal)
	{
		this.controladorPrincipal= controladorPrincipal;
		
		interfazGrafica= new InterfazGraficaReporteVenta();
		
		ventas= new ArrayList<Venta>();
		
		
		interfazGrafica.addListener((WindowListener) this);
		interfazGrafica.addListener((ActionListener) this);
		interfazGrafica.addListener((ItemListener) this);
		interfazGrafica.visualizarVentana();
	}
	

	@Override
	public void windowClosing(WindowEvent arg0) {
		interfazGrafica.descargarMemoria();
		controladorPrincipal.visualizarVentanaPrincipal();
		
	}

	

	@Override
	public void windowOpened(WindowEvent arg0) 
	{
		cargarTabla();
		
	}

	@Override
	public void actionPerformed(ActionEvent evt) 
	{
		if (evt.getActionCommand().equalsIgnoreCase("Guardar"))
		{
			if (ventas!=null && !ventas.isEmpty())
			{
				 JFileChooser fc= new JFileChooser();
	             fc.setFileFilter(new FileNameExtensionFilter(".txt","txt"));
	             File archivo= new File("ReporteVentas.txt");
	             
	             fc.setSelectedFile(archivo);
	
	             if (fc.showSaveDialog(null)== JFileChooser.APPROVE_OPTION)
	             {
	                     archivo = fc.getSelectedFile();
	
	                     /*Para que siempre se coloque la extension .txt*/
	                   if (!archivo.getAbsolutePath().contains(".txt"))
	                        archivo= new File(archivo.getAbsolutePath() + ".txt");
	                    
	                   try
	                   {  
	                	   new ControladorGuardarReporte<Venta>(interfazGrafica.getVentana(),archivo,ventas,"Reporte Ventas");
	                   }
	                   catch(Exception e)
	                   {
	                	   Mensaje.mostrarError("Error Guardando Reporte!"); 
	                   }
	
	             }
			}
			else
				Mensaje.mostrarInformacion("No Existen Ventas Procesadas!");
		}
		else if (evt.getActionCommand().equalsIgnoreCase("Salir"))
		{
			controladorPrincipal.visualizarVentanaPrincipal();
			interfazGrafica.descargarMemoria();
	    }	
		
	}
	
	
	
	private void cargarTabla()
	{
		try
		{
			TableModel modeloTabla= new DefaultTableModel();
			VentaDao ventaDao= new VentaDao();
			  
			if (interfazGrafica.indiceSeleccionado()==0 || interfazGrafica.indiceSeleccionado()==1)
			{
				  String[] encabezados= {"Nro Factura","Cliente","Fecha Emision","Porc Impuesto","Porc Descuento","Total Bsf"};
				  
				  while (ventas.size()!=ventaDao.getNroVentasActivas())
				  {	  
					  new ControladorCargar<Venta>(ventas,interfazGrafica.getVentana(),new modelo.VentaDaoSwingWorker());
				  }	  		  
				  
				  if (interfazGrafica.indiceSeleccionado()==0)
				  {
					 java.util.Collections.sort(ventas,new Venta.ComparadorMontoAsc() ); 
				  }
				  else
				  {
					  java.util.Collections.sort(ventas,new Venta.ComparadorMontoDesc()); 
				  }
				  
				
				  if (!ventas.isEmpty())
				  {
					  Object data[][]= new Object[ventas.size()][encabezados.length];
					  
					  int i=0;
					  
					  for (Venta venta:ventas)
					  {
						  data[i][0]= venta.getCodigoVenta();
						  data[i][1]= venta.getCliente().getCodCliente();
						  data[i][2]= venta.getFechaFormateada();
						  data[i][3]= venta.getPorcImpuesto();
						  data[i][4]= venta.getPorcDescuento();
						  data[i][5]= venta.getTotalPagar();
						  ++i;
					  }
					  
			          modeloTabla= new ModeloTabla(data,encabezados);		  
					  
				  }
			      
			}
			else
			{
				String[] encabezados= {"Nro Factura","Cliente","Fecha Emision","Total Bsf","Cantidad Productos"};
				  
				   while (ventas.size()!=ventaDao.getNroVentasActivas())
				  {	  
					   new ControladorCargar<Venta>(ventas,interfazGrafica.getVentana(),new modelo.VentaDaoSwingWorker());
				  }	
				
				  if (interfazGrafica.indiceSeleccionado()==2)
				  {
					  java.util.Collections.sort(ventas,new Venta.ComparadorCantidadAsc() );
				  }
				  else
				  {
					  java.util.Collections.sort(ventas,new Venta.ComparadorCantidadDesc() );
				  }
				  
				  if (!ventas.isEmpty())
				  {
					  Object data[][]= new Object[ventas.size()][encabezados.length];
					  
					  int i=0;
					  
					  for (Venta venta:ventas)
					  {
						  data[i][0]= venta.getCodigoVenta();
						  data[i][1]= venta.getCliente().getCodCliente();
						  data[i][2]= venta.getFechaFormateada();
						  data[i][3]= venta.getTotalPagar();
						  data[i][4]= venta.getCantidadProductos();
						  ++i;
					  }
					  
			          modeloTabla= new ModeloTabla(data,encabezados);		  
					  
				  }
			}
			
			interfazGrafica.asignarModeloTabla(modeloTabla);
		}
		catch(Exception e)
		{
			interfazGrafica.asignarModeloTabla(new DefaultTableModel());
			Mensaje.mostrarError("Error cargando Tabla!!!");
		}
	}
	
	
	
	private class ModeloTabla extends DefaultTableModel
	{


		public ModeloTabla(Object[][] data, Object[] columnNames) {
			super(data, columnNames);
			
		}
	
		public boolean isCellEditable(int row,int col)
		{
			return false;
		}
		
	}



	@Override
	public void itemStateChanged(ItemEvent evt) 
	{
		if (evt.getSource() instanceof javax.swing.JComboBox)
		{
			cargarTabla();
		}
		
	}
	
	@Override
	public void windowDeactivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowDeiconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowIconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void windowActivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosed(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	

}
